Skip to content

缓存更新策略

1.1 背景

  1. 引入缓存层后,除了享受缓存技术带来的并发性能的提升,还要做好缓存的维护工作,处理数据一致性问题,至于缓存的性能和数据一致性之间的权衡,不同的业务背景有不同的实现。

1.2 缓存更新策略

image-20260404151204524

  1. 主动更新策略:

    • 由我们自己在更新缓存时更新数据库

    • 缓存和数据库整合为一个服务,调用者调用该服务即可

    • 调用者只更新缓存,由其他线程异步的将缓存数据持久化到数据库中,保持最终一致,但是如果中间缓存宕机了,数据会丢失,可靠性不高。

    我们选择手动编码的方式维护缓存数据和数据库的一致性。

  2. 在手动维护缓存数据的时候,有三个问题需要考虑:

    • 删除缓存还是更新缓存?

      初答:

      • 分业务情况,如果对数据更新的粒度比较细,如改和删数据,操作缓存比较麻烦,我们就选择删除缓存
      • 如果是增加数据,大多数情况下,都可以直接增加缓存

      改进:

      • 大多数情况下使用删除策略,因为删除是幂等(操作多次结果相同)的。
    • 如何保证缓存和数据库操作的原子性?

      初答:

      • 责任链加回滚机制?
      • 异常中断回滚机制?

      改进:

      • 单体应用可以将两个业务逻辑放在一个事务中实现,先操作数据库,后操作缓存

      • 订阅Binlog(如Canal):由 Canal 监听 MySQL 的 Binlog 变更,异步、自动地去删除/更新 Redis。这样业务代码解耦,且能保证数据库成功后缓存一定处理。还可以配合MQ,失败后,继续推送消息。

    • 操作缓存和操作数据库的顺序?

      初答:

      • 先更新数据库,如果缓存不存在可以去查数据库,从而回写缓存